#include "MainWindow.h"
#include "ui_MainWindow.h"
#include <QInputDialog>
#include <QKeyEvent>
#include <QMessageBox>

/**
 * 构造方法。
 * @param parent    父窗口
 */
MainWindow::MainWindow(QWidget* parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow),
    mGameBoard(this, 0, 0, Const::GAME_BOARD_WIDTH, Const::GAME_BOARD_HEIGHT) {
    ui->setupUi(this);

    // 游戏区域的 Y 坐标要设置为菜单栏的高度，这样游戏区域就在菜单栏的下方了
    mGameBoard.move(0, ui->menuBar->height() + 1);

    // 设置状态栏
    int labelWidth = QMainWindow::width() / Const::STATUS_BAR_PART_COUNT;
    ui->statusBar->addWidget(&mLabelLevel, labelWidth);
    ui->statusBar->addWidget(&mLabelMoveCount, labelWidth);

    // 创建游戏
    mGame = new Game(mGameBoard.getBitmap(), &mGameBoard);

    // 连接信号与槽
    QMainWindow::connect(mGame, SIGNAL(UM_MAN_MOVED(int)), SLOT(onManMoved(int)));
    QMainWindow::connect(mGame, SIGNAL(UM_GOTO_LEVEL(int)), SLOT(onGotoLevel(int)));
    QMainWindow::connect(mGame, SIGNAL(UM_GAME_OVER(bool)), SLOT(onGameOver(bool)));
    this->onGotoLevel(1);
}

/**
 * 析构方法。
 */
MainWindow::~MainWindow() {
    delete mGame;
    delete ui;
}

/**
 * 按键事件的响应方法。
 * @param e 事件相关信息
 */
void MainWindow::keyPressEvent(QKeyEvent* e) {
    mGame->onKeyPressed(e->key());
}

/**
 * "重玩本关"菜单项的单击响应方法。
 */
void MainWindow::on_actionRestart_triggered() {
    mGame->restart();
}

/**
 * "选关"菜单项的单击响应方法。
 */
void MainWindow::on_actionSelectLevel_triggered() {
    QInputDialog inputDialog(this);
    bool ok = false;
    int level = inputDialog.getInt(this, " ", tr("IDS_PLEASE_INPUT_NUMBER").arg(1)
        .arg(Const::LEVEL_COUNT), 1, 1, Const::LEVEL_COUNT, 1, &ok);
    if (ok) {
        mGame->gotoLevel(level);
    }
}

/**
 * "回退"菜单项的单击响应方法。
 */
void MainWindow::on_actionUndo_triggered() {
    mGame->undo();
}

/**
 * 游戏结束事件的响应方法。
 * @param allOver   全部通关则为 true，否则为 false
 */
void MainWindow::onGameOver(bool allOver) {
    if (allOver) {
        QMessageBox::information(this, " ", tr("IDS_WON_ALL_OVER"));
    } else {
        QMessageBox::information(this, " ", tr("IDS_WON"));
    }
}

/**
 * 进入关卡事件的响应方法。
 * @param level    关卡数
 */
void MainWindow::onGotoLevel(int level) {
    mLabelLevel.setText(tr("IDS_LEVEL").arg(level));
    mLabelMoveCount.setText(tr("IDS_MOVE_COUNT").arg(0));
}

/**
 * 小人移动事件的响应方法。
 * @param moveCount    小人移动次数
 */
void MainWindow::onManMoved(int moveCount) {
    mLabelMoveCount.setText(tr("IDS_MOVE_COUNT").arg(moveCount));
}
